perm filename SEG1.SAI[SYS,HE]1 blob
sn#016518 filedate 1972-12-06 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 ENTRY DUMMY
00003 00003 α LPAIRS
00006 00004 α DISJOINT
00007 00005 α FIXUP 1
00009 00006 α FIXUP 2
00012 00007 α TRY0
00014 00008 α TRY1
00016 00009 α TRY2
00017 00010 α TRY4
00023 00011 α TRY5
00025 00012 α SPLICE
00027 ENDMK
⊗;
ENTRY DUMMY;
BEGIN "SEG1"
REQUIRE 100 PNAMES;
REQUIRE 100 NEW_ITEMS;
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "SYMBOL.AUX[H,RPO]" SOURCE_FILE;
REQUIRE "SEGCOM.AUX[SYS,HE]" SOURCE_FILE;
REQUIRE "SEGDPY.HDR[SYS,HE]" SOURCE_FILE;
DEFINE
MERGE(N)=<MERGED[N]←MERGED[N]+1>;
α EXTERNAL PROCEDURES;
EBP COLINEAR(ITEMVAR L1,L2);
ERP DIST(SAFE REAL ARRAY ITEMVAR V1,V2);
EP MERGE_NODE(SET ITEMVAR Y,X);
EBP VERT(ITEMVAR E);
EBP PARALLEL(ITEMVAR L1,L2);
ESP PRINTNAME(ITEMVAR X);
α LPAIRS
look for matched BADL's and set up a node called LPAIR
whose ∂ is the two colinear lines.
[NOTE: this creates a node for each of the BADL vertices.]
Quite obviously, this is not the right thing to do...a line
between the BADLs should be created and added to the created
nodes.
;
INTERNAL PROCEDURE LPAIRS;
BEGIN "LPAIRS"
∀ R|REGION⊗S≡R DO
∀ P1|CORNER⊗R≡P1 ∧ FLAVOR⊗P1≡BADL DO
∀ P2| CORNER⊗R≡P2 ∧ FLAVOR⊗P2≡BADL ∧ (P1≠P2) ∧
(¬(LPAIR⊗P2≡P1)) ∧ (ENDPT`P2∩ENDPT`P1=PHI) DO
BEGIN "LPAIR1"
S2←ENDPT`P1;
L1←LOP(S2);
L2←COP(S2);
S2←ENDPT`P2;
L3←LOP(S2);
L4←COP(S2);
BOOL←FALSE;
IF COLINEAR(L1,L3)
THEN S2←{L1,L3}
ELSE IF COLINEAR(L1,L4)
THEN S2←{L1,L4}
ELSE IF COLINEAR(L2,L3)
THEN S2←{L2,L3}
ELSE IF COLINEAR(L2,L4)
THEN S2←{L2,L4}
ELSE BOOL←TRUE;
IF ¬BOOL
THEN BEGIN "DO LPAIR"
DPYINFO("LPAIR: "&PRINTNAME(P1)&" "&PRINTNAME(P2));
MAKE LPAIR⊗P1≡P2;
SIV←NEW(PHI);
∂(SIV)←S2;
α XX←NEW(SIZE7): NEW_PNAME(XX,"P"&CVS(∂(NEWP)←∂(NEWP)+1));
α ∂(XX)[6]←∂(P1)[6];
α ∂(XX)[7]←∂(P1)[7];
MAKE NMATCH⊗SIV≡P1;
MAKE NODE⊗GRAPH≡SIV;
MAKE NFLAVOR⊗SIV≡LPAIR;
DPYBRK;
END "DO LPAIR";
END "LPAIR1";
END "LPAIRS";
α DISJOINT
merge disjoint nodes that each contain a TJOINT,
where the TJOINTs have colinear TSTEMs;
INTERNAL PROCEDURE DISJOINT;
BEGIN "DISJOINT"
∀ U,V|UεTSTEMS ∧ VεTSTEMS ∧ (U≠V) DO
IF COLINEAR(U,V)
THEN ∀ X,Y|NODE⊗GRAPH≡X ∧ NODE⊗GRAPH≡Y ∧ (X≠Y) DO
IF (Uε∂(X) ∧ Vε∂(Y)) ∨ (Uε∂(Y) ∧ Vε∂(X))
THEN BEGIN "MERGE DISJOINTS"
DPYBOOL←TRUE;
MERGE_NODE(Y,X);
MERGE(1);
TYPE "MERGING 2 CLUMPS BECAUSE OF "&
PRINTNAME(U)&" AND "&PRINTNAME(V) EOM;
REMOVE U FROM TSTEMS;
REMOVE V FROM TSTEMS;
END "MERGE DISJOINTS";
END "DISJOINT";
α FIXUP 1
for any node of the graph which is a single TJOINT where one
of the colinear portions is also a part of a BADL and the other line
of the BADL belongs to some other node of the graph, merge the TJOINT
node with this node;
INTERNAL PROCEDURE FIXUP1;
BEGIN "FIXUP1"
∀ X|NODE⊗GRAPH≡X ∧ NFLAVOR⊗X≡TJOINT DO
IF LENGTH(∂(X))=2
THEN BEGIN "T AND L"
LABEL OUT1;
S2←∂(X);
L1←LOP(S2);
L2←COP(S2);
ASSIGN P|NMATCH⊗X≡P HOLDS;
S2←ENDPT⊗L1∪ENDPT⊗L2;
REMOVE P FROM S2;
∀ P|PεS2 ∧ FLAVOR⊗P≡BADL DO
∀ Y| NODE⊗GRAPH≡Y DO
IF ENDPT`P∩∂(Y)≠PHI
THEN BEGIN "DO FIX1"
DPYBOOL←TRUE;
MERGE_NODE(X,Y);
merge(2);
GO TO OUT1;
END "DO FIX1";
OUT1:
END "T AND L";
END "FIXUP1";
α FIXUP 2
this case handles a dangling GOODL that would otherwise be
discarded if both edges of the GOODL are also stems of TJOINTs;
INTERNAL PROCEDURE FIXUP2;
BEGIN "FIXUP2"
∀ X|NODE⊗GRAPH≡X ∧ NFLAVOR⊗X≡GOODL DO
IF LENGTH(∂(X))=2
THEN BEGIN "D GOODL"
LABEL OUT4;
ASSIGN P|NMATCH⊗X≡P HOLDS;
S2←ENDPT`P;
IF ¬S2≤TSTEMS THEN GO TO OUT4;
L1←LOP(S2);
L2←COP(S2);
S3←ENDPT⊗L1∪ENDPT⊗L2;
REMOVE P FROM S3;
P1←LOP(S3);
P2←COP(S3);
IF FLAVOR⊗P1≡TJOINT ∧ FLAVOR⊗P2≡TJOINT
THEN BEGIN "DG2"
ASSIGN R|BOUNDARY⊗R≡L1 ∧ BOUNDARY⊗R≡L2 ∧ (R≠BACK) HOLDS;
∀ LX|LXε{L1,L2} DO
BEGIN "DG3"
PX←COP(ENDPT⊗LX-{P});
ASSIGN L|ENDPT⊗L≡PX ∧ (L≠LX) ∧ (BOUNDARY⊗R≡L) HOLDS;
S3←ENDPT⊗L;
P3←LOP(S3);
P4←COP(S3);
IF FLAVOR⊗P3≡TJOINT ∧ FLAVOR⊗P4≡TJOINT
THEN BEGIN "DG4"
IF P3ε{P1,P2} THEN P5←P4 ELSE P5←P3;
ASSIGN L1|ENDPT⊗L1≡P5 ∧ (L1≠L) ∧ BOUNDARY⊗R≡L1 HOLDS;
∀ Y|NODE⊗GRAPH≡Y DO
IF L1ε∂(Y)
THEN BEGIN "DG5"
∂(Y)←∂(Y)∪ENDPT`P;
S1←S1∪S2;
merge(3);
DPYBOOL←TRUE;
MERGE_NODE(X,Y);
GO TO OUT4;
END "DG5";
END "DG4";
END "DG3"
END "DG2";
OUT4:
END "D GOODL";
END "FIXUP2";
α TRY0
if two connected BADLs belong to the same node, the line
between them isn't. Therefore include it.
Further, if two connected BADLs don't belong to the same
node, the line between them should be put in one node or
the other...
p0 o----------o-----------o p2
p1
p0 p1 p2 result
ARROW BADL BADL p0 gets both arms
ARROW BADL GOODL p0 gets 1/2, p2 gets 1/2
GOODY BADL - p0 gets both
GOODY BADL BADL p0 gets 1/2, p2 gets 1/2
GOODL BADL GOODL p0 gets 1/2, p2 gets 1/2
BADL BADL BADL p0 gets both
;
INTERNAL PROCEDURE TRY0;
BEGIN "TRY0"
ITEMVAR L,LA,LB,VA,VB;
SET S2;
SET ITEMVAR X;
∀ L|LINE⊗S≡L ∧ (¬(LεS1)) DO
BEGIN "LEFTOUT"
S2←ENDPT⊗L;
VA←LOP(S2);
VB←COP(S2);
IF FLAVOR⊗VA≡BADL ∧ FLAVOR⊗VB≡BADL
THEN BEGIN "WANTED"
S2←ENDPT`VA-{L};
LA←COP(S2);
S2←ENDPT`VB-{L};
LB←COP(S2);
∀ X|NODE⊗GRAPH≡X DO
IF LAε∂(X) ∧ LBε∂(X)
THEN BEGIN "HERE"
TYPE "TRY0 - UNACCOUNTED LINE "&PRINTNAME(L)&
" PUT IN NODE." EOM;
PUT L IN ∂(X);
END "HERE";
END "WANTED";
END "LEFTOUT";
END "TRY0";
α TRY1
THE SET "S1" CONTAINS ALL THE LINES CONTAINED AS NODE DATUMS.
THE SET "S2" IS A TEMPORARY SET USED IN LINE MANIPULATION.
this is concerned with the lines of the scene which
are not accounted for by the graph node ∂s...if the line
is between TJOINTs or BADAROs or combos of these, then find
the first graph node having a line colinear with this line
and put the line into that node;
INTERNAL SUBR TRY1;
∀ R,L|REGION⊗S≡R ∧ BOUNDARY⊗R≡L ∧ (¬LεS1) DO
BEGIN "TRY 1"
LABEL OUT2;
S2←ENDPT⊗L;
P1←LOP(S2);
P2←COP(S2);
IF (FLAVOR⊗P1≡TJOINT ∨ FLAVOR⊗P1≡BADARO) ∧
(FLAVOR⊗P2≡TJOINT ∨ FLAVOR⊗P2≡BADARO)
THEN BEGIN
S2←BOUNDARY⊗R;
REMOVE L FROM S2;
∀ L1|L1εS2 DO
IF COLINEAR(L,L1)
THEN ∀ X|NODE⊗GRAPH≡X DO
IF L1ε∂(X)
THEN BEGIN
∂(X) ← ∂(X)∪{L};
TYPE "TRY 1 - LINE "&PRINTNAME(L)&" OF REGION "&
PRINTNAME(R)&" ADDED TO NODE" EOM;
PUT L IN S1;
GO TO OUT2;
END;
END;
OUT2:
END "TRY 1";
α TRY2
if some of the lines of a non-background regions are
contained in any node, then add the rest of the
region's lines to that node.
;
INTERNAL SUBR TRY2;
∀ R|REGION⊗S≡R ∧ (R≠BACK) DO
BEGIN "TRY 2"
LABEL LABA;
S3←BOUNDARY⊗R;
S2←BOUNDARY⊗R∩S1;
IF LENGTH(S2)=0 ∨ (S2=S3)
THEN GO TO LABA;
∀ X| NODE⊗GRAPH≡X DO
IF S2<∂(X)
THEN BEGIN
∀ L|BOUNDARY⊗R≡L DO
BEGIN
TYPE "TRY 2 - LINE "&PRINTNAME(L)&" OF REGION "&
PRINTNAME(R)&" ADDED." EOM;
∂(X)←∂(X)∪{L};
PUT L IN S1;
END;
DONE;
END;
LABA:
END "TRY 2";
α TRY4
DOUBLE is the set of lines that were duplicated at XJOINTs and KJOINTs
assign the regions of the scene to bodies;
INTERNAL SUBR TRY4;
BEGIN "TRY4"
∀ R|REGION⊗S≡R ∧ (R≠BACK) DO
BEGIN "TRY 41"
LABEL NEXTR;
IF DEBUG2
THEN BEGIN
HYDPOG(BPOG);
DPYSET(DPYAA);
DPYBRT(BRIGHT);
∀ L|BOUNDARY⊗R≡L DO DPYL(L);
DPYOUT(APOG);
END;
α region assigned by BOUNDARY argument;
S2←BOUNDARY⊗R∩S1-DOUBLE;
∀ B|BODY⊗S≡B DO
IF S2<LINE⊗B
THEN BEGIN
MAKE FACE⊗B≡R;
DPYLAB("GOBBLED BY "&PRINTNAME(B));
GO TO NEXTR;
END;
α region assigned by CORNER argument;
S2←CORNER⊗R;
∀ B|BODY⊗S≡B DO
IF S2<POINT⊗B
THEN BEGIN
MAKE FACE⊗B≡R;
DPYLAB("GOBBLED BY "&PRINTNAME(B));
GO TO NEXTR;
END;
α leftover region to be considered;
TYPE "LEFTOVER "&PRINTNAME(R) EOM;
BBADLCNT←0;
BB1←BB2←NIL;
∀ X|CORNER⊗R≡X DO
α if a CORNER of the region is BADL and the lines forming the point are all
contained in the datums of the nodes...;
IF FLAVOR⊗X≡BADL ∧ ENDPT`X<S1
THEN BEGIN "BADL"
SX←ENDPT`X;
α ...get the two lines of the BADL...;
L1←LOP(SX);
L2←COP(SX);
α ...pickup the two bodies that contain the two lines that make the BADL...;
ASSIGN B1|LINE⊗B1≡L1 ∧ (B1≠S) HOLDS;
ASSIGN B2|LINE⊗B2≡L2 ∧ (B2≠S) HOLDS;
TYPE "TRY4 - (BADL "&PRINTNAME(X)&")"&
PRINTNAME(B1)&" "&PRINTNAME(B2)&
" "&PRINTNAME(BB1)&" "&PRINTNAME(BB2) EOM;
α ...distinct bodies not seen before ??...;
IF B1≠B2 ∧ {B1,B2}≠{BB1,BB2}
THEN BEGIN "ADD 1"
BB1←B1;
BB2←B2;
BBADLCNT←BBADLCNT+1;
END "ADD 1";
END "BADL";
IF BBADLCNT=0
α ...look at each region boundary that belongs to a node...;
THEN ∀ L|BOUNDARY⊗R≡L ∧ LεS1 DO
α ...there weren't any BADL corners for this bodyless region...;
IF LεTSTEMS
THEN BEGIN "TSTEMS"
LABEL NEXTL;
SX←ENDPT⊗L;
P1←LOP(SX);
P2←COP(SX);
IF FLAVOR⊗P1≡BADL ∨ FLAVOR⊗P2≡BADL
THEN GO TO NEXTL;
ASSIGN B|BODY⊗S≡B ∧ LINE⊗B≡L HOLDS;
MAKE FACE⊗B≡R;
DPYLAB("GOBBLED BY "&PRINTNAME(B));
GO TO NEXTR;
NEXTL:
END "TSTEMS";
∀ C|CORNER⊗R≡C ∧ FLAVOR⊗C≡BADY ∧ (LENGTH(ENDPT`C∩S1)=3) DO
BEGIN "BADY"
L1←NIL;
∀ L|ENDPT⊗L≡C DO
BEGIN
SX←ENDPT`C-{L};
∀ B|BODY⊗S≡B DO
IF SX<LINE⊗B THEN L1←L;
END;
IF L1=NIL
THEN BEGIN
TYPE "TRY4 - BADY REGION ASSIGNMENT ERROR." EOM;
RETURN;
END;
ASSIGN B|LINE⊗B≡L ∧ (B≠S) HOLDS;
DPYLAB("GOBBLED BY "&PRINTNAME(B));
MAKE FACE⊗B≡R;
GO TO NEXTR;
END "BADY";
IF BBADLCNT=1
THEN BEGIN "BADL 1"
STR←PRINTNAME(R)&"bad1";
R1←NEW; NEW_PNAME(R1,STR);
STR←PRINTNAME(R)&"bad2";
R2←NEW; NEW_PNAME(R2,STR);
α the first AND ONLY instance of PARENT in the SEGMENTER -
an association between REGIONs;
MAKE PARENT⊗R2≡R;
MAKE PARENT⊗R1≡R;
MAKE FACE⊗BB1≡R1;
MAKE FACE⊗BB2≡R2;
α ,,,this bit of code assigns the wrong line to a
newly created region...must be more selective...;
∀ L|BOUNDARY⊗R≡L DO
BEGIN
MAKE BOUNDARY⊗R1≡L;
MAKE BOUNDARY⊗R2≡L;
END;
∀ P|CORNER⊗R≡P DO
BEGIN
MAKE CORNER⊗R1≡P;
MAKE CORNER⊗R2≡P;
END;
α these next two statements will prohibit backup !!;
α ERASE BOUNDARY⊗R≡ANY;
α ERASE CORNER⊗R≡ANY;
GO TO NEXTR;
END "BADL 1";
IF BBADLCNT>1 THEN TYPE "TRY4 - MORE THAN 1 BAD BADL!" EOM;
NEXTR:
HYDPOG(APOG);
END "TRY 41";
END "TRY4";
α TRY5
This looks like it tries to remove the lines
between bad vertices from a region.
;
INTERNAL SUBR TRY5;
∀ B,F|BODY⊗S≡B ∧ FACE⊗B≡F DO
BEGIN "TRY 5"
STR←PRINTNAME(F);
IF EQU(STR[∞-3 TO ∞-1],"bad")
THEN BEGIN "T5"
S2←BOUNDARY⊗F ∩ LINE⊗B;
∀ L|LεS2 DO
BEGIN "T51"
BOOL←FALSE;
SX←ENDPT⊗L;
P1←LOP(SX);
P2←COP(SX);
IF ((FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡BADL) ∨
(FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡TJOINT) ∨
(FLAVOR⊗P1≡TJOINT ∧ FLAVOR⊗P2≡BADL) ∨
(FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡BADARO) ∨
(FLAVOR⊗P1≡BADARO ∧ FLAVOR⊗P2≡BADL))
THEN BOOL←TRUE;
END "T51";
IF BOOL
THEN BEGIN "T52"
DPYBOOL←TRUE;
TYPE "TRY5 - LINE "&PRINTNAME(L)&
" SHOULDN'T BE IN REGION "&PRINTNAME(F) EOM;
ERASE BOUNDARY⊗F≡L;
IF LENGTH(ENDPT`P1 ∩ S2)=1 THEN ERASE CORNER⊗F≡P1;
IF LENGTH(ENDPT`P2 ∩ S2)=1 THEN ERASE CORNER⊗F≡P2;
IF LENGTH(ENDPT`P1)=1 THEN ERASE POINT⊗B≡P1;
IF LENGTH(ENDPT`P2)=1 THEN ERASE POINT⊗B≡P2;
ERASE LINE⊗BODY≡L;
ERASE ENDPT⊗L≡P1;
ERASE ENDPT⊗L≡P2;
END "T52";
END "T5";
END "TRY 5";
α SPLICE
merge colinear touching lines of a body into one line
O----------O------------O
L1 P L2 W
;
INTERNAL PROCEDURE SPLICE;
∀ B,P|BODY⊗S≡B ∧ POINT⊗B≡P ∧ (LENGTH(LINE⊗B∩ENDPT`P)=2) ∧
(FLAVOR⊗P≡TJOINT ∨ FLAVOR⊗P≡KJOINT ∨ FLAVOR⊗P≡GOODL) DO
BEGIN "L10" SET SR;
S2←ENDPT`P∩LINE⊗B;
L1←LOP(S2);
L2←COP(S2);
IF COLINEAR(L1,L2)
THEN BEGIN
TYPE "END OF SEGMENTER FINDS 2 COLINEAR LINES AT "&
PRINTNAME(P) EOM;
W←COP(ENDPT⊗L2-{P});
SR←((BOUNDARY`L2)∩(FACE⊗B))-{BACK};
∀ R|RεSR DO
BEGIN ERASE CORNER⊗R≡P;
ERASE BOUNDARY⊗R≡L2;
END;
ERASE LINE⊗B≡L2;
ERASE POINT⊗B≡P;
ERASE ENDPT⊗L2≡P;
ERASE ENDPT⊗L2≡W;
ERASE ENDPT⊗L1≡P;
MAKE ENDPT⊗L1≡W;
∀ W|OCCLUDER⊗W≡L2 DO
BEGIN
ERASE OCCLUDER⊗W≡L2;
MAKE OCCLUDER⊗W≡L1;
END;
α a GOODL may be occluded by some one else;
∀ W|OCCLUDER⊗L2≡W DO
BEGIN
ERASE OCCLUDER⊗L2≡W;
MAKE OCCLUDER⊗L1≡W;
END;
∀ W|SON⊗L2≡W DO
BEGIN
ERASE SON⊗L2≡W;
MAKE SON⊗L1≡W;
END;
∀ W|SON⊗W≡L2 DO
BEGIN
ERASE SON⊗W≡L2;
MAKE SON⊗W≡L1;
END;
α HOW, then, can SON ever be, except between LINEs !!!!!;
MAKE SON⊗L1≡L2;
END;
END "L10";
END "SEG1";